package com.liliudong.template.common.vo;

import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.Data;

import java.util.List;
import java.util.function.Function;

/**
 * 分页结果
 *
 * @author ldli5
 * @classname PageVO
 * @date 2024/6/20-14:28
 */
@Data
public class PageVO<T> {

	/**
	 * 记录
	 */
	private List<T> records;

	/**
	 * 大小
	 */
	private Long size;

	/**
	 * 现在
	 */
	private Long current;

	/**
	 * 全部
	 */
	private Long total;
	
	private PageVO() {
		// 私有化构造器，不推荐外部new构造
	}

	public static <R> PageVO<R> of(IPage<R> page) {
		PageVO<R> pageVO = new PageVO<>();
		pageVO.setRecords(page.getRecords());
		pageVO.setSize(page.getSize());
		pageVO.setCurrent(page.getCurrent());
		pageVO.setTotal(page.getTotal());
		return pageVO;
	}

	public static <R, O> PageVO<R> of(IPage<O> page, List<R> records) {
		PageVO<R> pageVO = new PageVO<>();
		pageVO.setRecords(records);
		pageVO.setSize(page.getSize());
		pageVO.setCurrent(page.getCurrent());
		pageVO.setTotal(page.getTotal());
		return pageVO;
	}

	public static <R, O> PageVO<R> of(IPage<O> page, Function<List<O>, List<R>> converter) {
		PageVO<R> pageVO = new PageVO<>();
		pageVO.setRecords(converter.apply(page.getRecords()));
		pageVO.setSize(page.getSize());
		pageVO.setCurrent(page.getCurrent());
		pageVO.setTotal(page.getTotal());
		return pageVO;
	}

	public static <R> PageVO<R> of(Long current, Long size, Long total, List<R> records) {
		PageVO<R> pageVO = new PageVO<>();
		pageVO.setRecords(records);
		pageVO.setSize(size);
		pageVO.setCurrent(current);
		pageVO.setTotal(total);
		return pageVO;
	}

}
